#ifndef FPLAYER_RESAMPLEWRAPPER_H
#define FPLAYER_RESAMPLEWRAPPER_H

#include "MediaDefine.h"

#ifdef __cplusplus
extern "C" {
#include "libavutil/opt.h"
#include "libswresample/swresample.h"
};
#endif //__cplusplus


/**
 * author: x-fan
 * date: 2024/1/15
 * desc: 音频重采样
 */
class ResampleWrapper {
private:
  //重采样对象
  SwrContext *_pSwrCtx = nullptr;

  int32_t _SrcSampleRate = 0;
  AVChannelLayout _SrcChLayout = AV_CHANNEL_LAYOUT_MONO;
  AVSampleFormat _SrcFmt = AV_SAMPLE_FMT_NONE;

  int32_t _DstSampleRate = 0;
  AVChannelLayout _DstChLayout = AV_CHANNEL_LAYOUT_MONO;
  AVSampleFormat _DstFmt = AV_SAMPLE_FMT_NONE;

  //源音频一帧采样数量
  int32_t _SrcNbSamples = 0;
  //转换后音频一帧采样数量
  int32_t _DstNbSamples = 0;
  //转换后音频一帧最大采样数量 在转换时，可能存在部分音频未转换的
  int32_t _MaxDstNbSample = 0;

  //重采样后的音频数据
  MediaFrame *_pMediaFrame = nullptr;

public:
  ResampleWrapper();

  virtual ~ResampleWrapper() noexcept;

  /**
   * 初始化重采样对象
   * @param srcChNum 音频输入通道数
   * @param srcSampleRate 音频输入采样率
   * @param srcSampleFmt  音频输入格式
   * @param ppMediaFrame  音频数据
   * @return true:初始化成功 false:反之
   */
  bool init(int32_t srcChNum, int32_t srcSampleRate, AVSampleFormat srcSampleFmt,
            MediaFrame **ppMediaFrame);

  /**
   * 转换音频数据
   * @param ppSrcData 音频源数据
   * @param srcNbSample 音频采样数量
   */
  void convert(const uint8_t **ppSrcData, int32_t srcNbSample);

  /**
   * @return 获取采样数量
   */
  int32_t getNbSamples();
};


#endif //FPLAYER_RESAMPLEWRAPPER_H
